// 云函数入口文件
const bcrypt = require('bcryptjs');
const cloud = require('wx-server-sdk');
const { treeItems } = require('./constant')
cloud.init({
    env: 'cloud1-4gqogyksa87ef4e2'
});
const db = cloud.database();
cloud.init();
const wqb_user = db.collection('wqb_user'); // 用户数据库
const wqb_grade = db.collection('wqb_grade'); // 年级里的错题数据库
// 云函数入口函数
let userInfo; // 用户信息
let userGrade; // 用户年级信息
exports.main = async (event, context) => {
    // 待优化，传入值应按照场景的不同决定
    const { phone, password, reqName } = event;
    let isExistPhone = false;// 查找集合中是否存在此用户
    let isPasswordValid = false; // 密码正确性
    let isLosePassword = false; // 忘记密码，是否修改成功结果
    let isExistOpenid = false; // 是否存在此 openid
    let existOpenidRes; // 查找openid的结果，可以检测当前微信用户，是否已经绑定
    let isAccountBind;
    const existPhoneRes = await wqb_user.where({
        phone,
    }).get();
    if (existPhoneRes.data.length === 1) {
        isExistPhone = true;
    };

    //  用户注册
    if (reqName === 'register' && !isExistPhone) {
        const { nickname } = event;
        await wqb_user.add({
            // data 字段表示需新增的 JSON 数据
            data: {
                phone, // 手机号，跟微信手机号有所区分
                password: bcrypt.hashSync(password, 10), //密码散列
                nickname, // 昵称
                avatar: 'https://s2.loli.net/2022/02/03/Ujy5SWxYesBJftb.png',
                creatDate: Date.now(), // 创建时间
                openid: '', // 微信的openid
                likeArr: [], // 用来存放用户的喜欢列表
            }
        })
            .then(async res => {
                // 注册成功，存入用户信息并返回
                userInfo = await wqb_user.doc(res._id).get();
                // 为用户创建一个，存储所有错题id的记录
                await wqb_grade.add({
                    data: {
                        uid: res._id,
                        phone,
                        grade: treeItems, // 全部年级信息
                    }
                })
                    .then(async res2 => {
                        userGrade = await wqb_grade.doc(res2._id).get();
                    })
            })
            .catch(console.error)
    };

    // 用户登录
    if (reqName === 'login' && isExistPhone) {
        //比较密码的正确性
        const { data } = existPhoneRes;
        isPasswordValid = bcrypt.compareSync(password, data[0].password);
        // 密码正确，存入用户信息
        if (isPasswordValid) {
            userInfo = data[0];
            // 并找到此用户的grade信息存入
            const getUserGrade = await wqb_grade.where({
                phone,
            }).get();
            userGrade = getUserGrade.data[0];
        }
    };

    // 忘记密码，直接修改
    if (reqName === 'losePassword' && isExistPhone) {
        const { _id } = existPhoneRes.data[0];
        await wqb_user.doc(_id).update({
            // data 传入需要局部更新的数据
            data: {
                password: bcrypt.hashSync(password, 10), //密码散列
            }
        })
            .then(res => {
                isLosePassword = true;
            })
    };

    // 微信登录
    if (reqName === 'wx-login') {
        const { openid } = event;
        existOpenidRes = await wqb_user.where({
            openid,
        }).get();
        if (existOpenidRes.data.length !== 0) {
            isExistOpenid = true; // 微信用户存在，已绑定
        };
        // 已经存在，直接登录
        if (isExistOpenid) {
            userInfo = existOpenidRes.data[0];
            const { phone } = userInfo;
            // 并找到此用户的grade信息存入
            const getUserGrade = await wqb_grade.where({
                phone,
            }).get();
            userGrade = getUserGrade.data[0];
        }
    };

    // 判断当前微信账号是否已绑定了错题集账号
    if(reqName === 'isAccountBind'){
        const { openid } = event; 
        // 只需判断当前用户信息中，是否能找到微信用户的 openid 即可
        existOpenidRes = await wqb_user.where({
            openid,
        }).get();
        if (existOpenidRes.data.length !== 0) {
            isExistOpenid = true; // 微信用户存在，已绑定
        };
    };

    // 微信账号和错题集账号绑定
    if (reqName === 'accountBind' && isExistPhone) {
        //比较密码的正确性
        isPasswordValid = bcrypt.compareSync(password, existPhoneRes.data[0].password);
        // 获取微信传来的参数
        const { openid, nickname, avatar } = event;
        const { _id } = existPhoneRes.data[0];
        if (isPasswordValid) {
            //  需要绑定，将微信传入的信息，重新覆盖到数据库
            await wqb_user.doc(_id).update({
                // data 传入需要局部更新的数据
                data: {
                    openid,
                    nickname,
                    avatar
                }
            })
                .then(async res => {
                    isAccountBind = true;
                    // 重新获取数据，赋值给userInfo
                    userInfo = await wqb_user.doc(_id).get();
                    // 找到对应的 wqb_grade 数据
                    const getUserGrade = await wqb_grade.where({
                        uid: _id,
                    }).get();
                    userGrade = getUserGrade.data[0];
                })
        }
    };

    // 微信账号和错题集账号解除绑定
    if (reqName === 'removeAccountBind' && isExistPhone) {
        const { _id } = existPhoneRes.data[0];
        const { nickname } = event;
        //  需要绑定，将微信传入的信息，重新覆盖到数据库
        await wqb_user.doc(_id).update({
            // data 传入需要局部更新的数据
            data: {
                openid: '',
                nickname,
                avatar: 'https://s2.loli.net/2022/02/03/Ujy5SWxYesBJftb.png',
            }
        }).then(res => {
            isAccountBind = true;
        })
    };

    // 根据 uid 获取用户列表
    if (reqName === 'GET_USER') {
        const { uid } = event;
        userInfo = await wqb_user.where({
            _id: uid,
        }).get();
    }

    return {
        isExistPhone,
        existPhoneRes,
        userInfo,
        isPasswordValid,
        isLosePassword,
        existOpenidRes,
        isExistOpenid,
        isAccountBind,
        userGrade,
        reqName,
    }

}